import {mergeFormValue, validateForm} from "@/uni_modules/u-form/components/u-form/controls";

/**
 * 表单事件
 * */
export const formHandler = {
    // 组件加载完毕事件
    onloadHandler(argumentsList: Record<string, any>): void
    {
        const {field} = argumentsList || {};

        const _this: Record<string, any> = this;

        if (_this.successField.has(field))
        {
            _this.successField.delete(field);
        }

        // 所有表单项加载完毕
        if (_this.successField.size === 0)
        {
            const formValue: Record<string, any> = mergeFormValue(_this.formList);

            // 触发onload事件
            _this.$emit("onload", {form: _this.formList, formValue: formValue});
        }
    }
};

/**
 * input控件的事件
 * */
export const inputHandler = {
    // 文本框输入事件
    inputChangeHandler(argumentsList: Record<string, any>): void
    {
        const {value, field, form, t} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["input"];

            // 初始化当前组件的错误状态
            form.validate = true;

            // 初始化当前组件的错误信息
            form.message = "";

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }

            // 触发验证
            if (_this.validateTrigger === "timely")
            {
                validateForm(_this.formList, t, [field]).finally();
            }
        });
    },
    // 文本框输入完成事件
    inputConfirmHandler(argumentsList: Record<string, any>): void
    {
        const {value, form} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["confirm"];

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }
        });
    },
    // 文本框获取焦点事件
    inputFocusHandler(argumentsList: Record<string, any>): void
    {
        const {value, form} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["focus"];

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }
        });
    },
    // 文本框失去焦点事件
    inputBlurHandler(argumentsList: Record<string, any>): void
    {
        const {value, form} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["blur"];

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }
        });
    }
};

/**
 * textarea控件的事件
 * */
export const textareaHandler = {
    // 文本域输入事件
    textareaChangeHandler(argumentsList: Record<string, any>): void
    {
        const {value, field, form, t} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["input"];

            // 初始化当前组件的错误状态
            form.validate = true;

            // 初始化当前组件的错误信息
            form.message = "";

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }

            // 触发验证
            if (_this.validateTrigger === "timely")
            {
                validateForm(_this.formList, t, [field]).finally();
            }
        });
    },
    // 文本域输入完成事件
    textareaConfirmHandler(argumentsList: Record<string, any>): void
    {
        const {value, form} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["confirm"];

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }
        });
    },
    // 文本域获取焦点事件
    textareaFocusHandler(argumentsList: Record<string, any>): void
    {
        const {value, form} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["focus"];

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }
        });
    },
    // 文本域失去焦点事件
    textareaBlurHandler(argumentsList: Record<string, any>): void
    {
        const {value, form} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["blur"];

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }
        });
    }
};

/**
 * radioGroup控件的事件
 * */
export const radioGroupHandler = {
    // 单选框选中事件
    radioGroupChangeHandler(argumentsList: Record<string, any>): void
    {
        const {value, field, form, t} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["change"];

            // 初始化当前组件的错误状态
            form.validate = true;

            // 初始化当前组件的错误信息
            form.message = "";

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }

            // 触发验证
            if (_this.validateTrigger === "timely")
            {
                validateForm(_this.formList, t, [field]).finally();
            }
        });
    }
};

/**
 * checkboxGGroup控件的事件
 * */
export const checkboxGroupHandler = {
    // 多选框选中事件
    checkboxGroupChangeHandler(argumentsList: Record<string, any>): void
    {
        const {value, field, form, t} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["change"];

            // 初始化当前组件的错误状态
            form.validate = true;

            // 初始化当前组件的错误信息
            form.message = "";

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }

            // 触发验证
            if (_this.validateTrigger === "timely")
            {
                validateForm(_this.formList, t, [field]).finally();
            }
        });
    }
};

/**
 * switch控件的事件
 * */
export const switchHandler = {
    // 开关选中事件
    switchChangeHandler(argumentsList: Record<string, any>): void
    {
        const {value, field, form, t} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["change"];

            // 初始化当前组件的错误状态
            form.validate = true;

            // 初始化当前组件的错误信息
            form.message = "";

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }

            // 触发验证
            if (_this.validateTrigger === "timely")
            {
                validateForm(_this.formList, t, [field]).finally();
            }
        });
    }
};

/**
 * slider控件的事件
 * */
export const sliderHandler = {
    // 滑块选中事件
    sliderChangeHandler(argumentsList: Record<string, any>): void
    {
        const {value, field, form, t} = argumentsList || {};

        // 获取当前组件实例
        const _this: Record<string, any> = this;

        // 在下一次DOM更新之后执行
        _this.$nextTick(() =>
        {
            // 执行配置的onInput事件
            const fun = form.componentProps["change"];

            // 初始化当前组件的错误状态
            form.validate = true;

            // 初始化当前组件的错误信息
            form.message = "";

            // 判断当前事件是否为函数
            if (fun && isFunction(fun))
            {
                // 执行事件
                fun.apply(_this, [{value: value, form: _this.formList, formValue: mergeFormValue(_this.formList)}]);
            }

            // 触发验证
            if (_this.validateTrigger === "timely")
            {
                validateForm(_this.formList, t, [field]).finally();
            }
        });
    }
};